package jp.androidgroup.chiba.androidresearch.oauth;

import java.net.URLEncoder;

import jp.androidgroup.chiba.androidresearch.Common;
import jp.androidgroup.chiba.androidresearch.Constants;

import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;

/**
 * OAuthConsumer と OAuthProvider を準備します。
 *
 * OAuthConsumer はコンシューマキーとコンシューマシークレットを設定します。
 * OAuthProvider は3つのOAuthエンドポイントで構成されています。
 *
 * 要求を取得するためにOAuthRequestTokenTaskを実行し、要求を承認します。
 * ユーザの認証許可後、呼び出し元にコールバックします。
 */
public class PrepareRequestTokenActivity extends Activity {

	private OAuthConsumer _consumer;
	private OAuthProvider _provider;

	private boolean isCalledOnCreate = false;
	private boolean isCalledOnNewIntent = false;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		isCalledOnCreate = true;

		try {
			SharedPreferencesManager spm = new SharedPreferencesManager(this);
			_consumer = spm.getOAuthConsumer();

			// 認証済みの場合は認証画面を表示することなく、最新のアカウント情報を取得し、
			// SharedPreferencesに保存するだけの処理を行って終了する。
			if (_consumer.getToken() == null
					|| _consumer.getToken().length() == 0) {
				_provider = new CommonsHttpOAuthProvider(
						Constants.REQUEST_URL
								+ "?scope="
								+ URLEncoder.encode(Constants.SCOPE,
										Constants.ENCODING)
								+ Constants.REQUEST_URL_QUERY_STR,
						Constants.ACCESS_URL, Constants.AUTHORIZE_URL);

				Log.i(Common.LOT_TAG, "Starting task to retrieve request token.");
				// 以下の処理はブラウザでOpenIDの認証画面を表示してユーザ認証を行う。
				// この処理が完了すると、「onNewIntent」が実行される。
				new OAuthRequestTokenTask(this, _consumer, _provider).execute();
			} else {
				new OAuthGoogleAccounts().doGoogleAuth(this, _consumer);
				finish();
			}
		} catch (Exception e) {
			Log.e(Common.LOT_TAG, "Error creating consumer / provider", e);
		}
	}

	@Override
	protected void onResume() {
		super.onResume();
		if (!isCalledOnCreate && !isCalledOnNewIntent) {
			finish();
		}
		isCalledOnCreate = false;
		isCalledOnNewIntent = false;
	}

	/**
	 * OAuthRequestTokenTaskが終了（ユーザーがリクエストトークンを承認）するとこのメソッドが呼ばれます。
	 * コールバックURLはここで傍受されます。
	 */
	@Override
	public void onNewIntent(Intent intent) {
		super.onNewIntent(intent);
		final Uri uri = intent.getData();
		isCalledOnNewIntent = true;
		if (uri != null
				&& uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) {
			Log.i(Common.LOT_TAG, "intent info : " + intent.toString());
			Log.i(Common.LOT_TAG, "Callback received : " + uri);
			Log.i(Common.LOT_TAG, "Retrieving Access Token");
			// 以下の処理でaccess_tokenなどの情報取得を行う。
			new RetrieveAccessTokenTask(this, _consumer, _provider)
					.execute(uri);
		}else{
			finish();
		}
	}
}
